package com.unitd.base.module.master.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.unitd.base.frame.util.BeanUtils;
import com.unitd.base.module.master.pojo.dto.CompanyDatasourceVO;
import com.unitd.base.module.master.pojo.dto.CompanyUserVO;
import com.unitd.base.module.master.mybatis.mapper.CompanyUserMapper;
import com.unitd.base.module.master.pojo.po.CompanyUserPO;
import com.unitd.base.module.master.service.CompanyUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 公司用户信息业务逻辑处理接口实现
 *
 * @author CompanyUser
 * @version 1.0
 * @filename CompanyUserServiceImpl.java
 * @copyright www.pactera.com
 * @date 2020-08-14
 */
@Slf4j
@Service
public class CompanyUserServiceImpl extends ServiceImpl<CompanyUserMapper, CompanyUserPO> implements CompanyUserService {

    /**
     * 根据查询条件获取公司客户分页列表信息
     *
     * @param param 查询条件(包含分页参数)
     * @return 公司用户信息列表
     */
    @Override
    public List<CompanyUserVO> selectByCompanyIdAndUserLevelId(Map<String, Object> param) {
        List<CompanyUserPO> pos = baseMapper.selectByCompanyIdAndUserLevelId(param);
        List<CompanyUserVO> list = new ArrayList<>();
        for (CompanyUserPO po : pos) {
            CompanyUserVO companyUserVO = convertPoToVo(po);
            list.add(companyUserVO);
        }
        return list;
    }

    /**
     * 根据公司用户ID,获取该公司用户信息
     *
     * @param companyId 所属公司ID
     * @param userId    公司用户ID
     * @return 公司用户信息
     */
    @Override
    public CompanyUserVO selectByCompanyIdAndUserId(Long companyId, Long userId) {
        CompanyUserPO po = baseMapper.selectByCompanyIdAndUserId(companyId, userId);
        return convertPoToVo(po);
    }

    /**
     * 新增/修改公司用户信息
     *
     * @param companyUser 公司用户详情
     * @return 新增/更新结果
     */
    @Override
    public int save(CompanyUserVO companyUser) {
        companyUser.setCreateTime(new Date(System.currentTimeMillis()));
        companyUser.setUpdateTime(new Date(System.currentTimeMillis()));
        CompanyUserPO po = convertVoToPo(companyUser);
        if (po.getId() != null && po.getId() > 0) {
            return baseMapper.updateById(po);
        } else {
            return baseMapper.insert(po);
        }
    }

    /**
     * 删除公司用户信息
     *
     * @param id 公司用户id
     * @return 删除结果
     */
    @Override
    public int deleteById(Long id) {
        return baseMapper.deleteById(id);
    }

    /**
     * 根据登录的公司管理员用户手机号,得到该管理员的公司用户信息
     *
     * @param mobile 登录的公司管理员用户手机号
     * @return 公司用户信息
     */
    @Override
    public CompanyUserVO selectByMobile(String mobile) {
        CompanyUserPO po = baseMapper.selectByMobile(mobile);
        return convertPoToVo(po);
    }

    /**
     * 根据手机号更新用户状态
     *
     * @param mobile 登录的公司管理员用户手机号
     * @return 公司用户信息
     */
    @Override
    public int updateStatusByMobile(String mobile, String status) {
        CompanyUserPO po = baseMapper.selectByMobile(mobile);
        po.setStatus(status);
        return baseMapper.updateById(po);
    }

    /**
     * 将po对象转换成vo对象
     *
     * @param po 数据库实体对象
     * @return 数据交互、展示对象
     */
    private CompanyUserVO convertPoToVo(CompanyUserPO po) {
        if (BeanUtils.isNull(po)) {
            return null;
        }

        CompanyUserVO vo = new CompanyUserVO();
        BeanUtils.copyProperties(po, vo);

        if (!BeanUtils.isNull(po.getCompanyDatasource())) {
            CompanyDatasourceVO companyDatasourceVO = new CompanyDatasourceVO();
            BeanUtils.copyProperties(po.getCompanyDatasource(), companyDatasourceVO);
            vo.setCompanyDatasource(companyDatasourceVO);
        }
        return vo;
    }

    /**
     * 将vo对象转换成po对象
     *
     * @param vo 数据库实体对象
     * @return 数据交互、展示对象
     */
    private CompanyUserPO convertVoToPo(CompanyUserVO vo) {
        if (vo.getCreateTime()==null){
            vo.setCreateTime(new Date(System.currentTimeMillis()));
        }
        if (vo.getUpdateTime()==null){
            vo.setUpdateTime(new Date(System.currentTimeMillis()));
        }
        CompanyUserPO po = new CompanyUserPO();
        BeanUtils.copyProperties(vo, po);
        return po;
    }
}